﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Obligatorio1.Modelo;
using Obligatorio1.Controladores;

namespace Obligatorio1
{
    class ManejadorPersona
    {
        private static ManejadorPersona manejador = null;

        public static ManejadorPersona getInstance()
        {
            if (manejador == null)
            { manejador = new ManejadorPersona(); }
            return manejador;
        }

        public void agergarPersona(Persona p) 
        {
            try
            {
                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
                oe.Persona.AddObject(p);
                oe.SaveChanges();
            }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }

        public void agergarPersona(String nombre, String apellido, DateTime fechNacimiento, String comentario)
        {
            try
            {
                Persona p = new Persona();
                p.nombre = nombre;
                p.apellido = apellido;
                p.fechaNacimiento = fechNacimiento;

                //La persona puede no tener comentario
                if (!comentario.Equals("")) { p.comentario = comentario; }

                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
                oe.Persona.AddObject(p);
                oe.SaveChanges();
            }
            catch (Exception e) { Console.WriteLine(e.Message); }

        }

        public void modificarPersona(Persona p, String nombre, String apellido, String comentario, DateTime fechNacimiento, byte[] foto)
        {
            try
            {            
                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
                if (!nombre.Equals("")) { p.nombre = nombre; }
                if (!apellido.Equals("")) { p.apellido = apellido; }
                if (!fechNacimiento.Equals("")) { p.fechaNacimiento = fechNacimiento; }
                if (!comentario.Equals("")) { p.comentario = comentario; }
                if (foto!= null) { p.foto = foto; }
                oe.SaveChanges();
            }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }

        public List<Persona> listar() 
        {
            Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
            var personas = from p in oe.Persona
                           orderby p.nombre
                           select p;
            return personas.ToList(); 
        }

        public Persona buscar(Int16 id)
        {
            try
            {            
                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();

                var personas = oe.Persona;
                foreach (var persona in personas)
                {
                    if (persona.id == id) { return persona; }

                }
                return null;
            }
            catch (Exception e) { Console.WriteLine(e.Message); return null; }
        }

        public void borrarPersona(Persona p) 
        {
            try
            {
                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
                oe.Persona.DeleteObject(p);
                oe.SaveChanges();
            }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }
        
        public void borrarDireccion(Direccion p)
        {
            try
            {
                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
                oe.Direccion.DeleteObject(p);
                oe.SaveChanges();
            }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }
        
        public void borrarTelefono(Telefono p)
        {
            try
            {
                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
                oe.Telefono.DeleteObject(p);
                oe.SaveChanges();
            }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }

        public void borrarGrupo(Persona p, Grupo g)
        {
            try
            {
                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
                p.Grupo.Remove(g);
                g.Persona.Remove(p);
                oe.SaveChanges();
                
            }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }

        public void borrarEmail(Email p)
        {
            try
            {
                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
                oe.Email.DeleteObject(p);
                oe.SaveChanges();
            }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }

        public void agergarDireccion(Persona p, Direccion d) 
        {
            try
            {
                ManejadorDireccion.getInstance().agregarDireccion(d);
                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
                p.Direccion.Add(d);
                //Probar de agregar la persona a la direccion
                oe.SaveChanges();
            }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }

        public void agergarTelefono(Persona p, Telefono t)
        {
            try
            {
                ManejadorTelefono.getInstance().agregarTelefono(t);
                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
                p.Telefono.Add(t);
                oe.SaveChanges();
            }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }

        public void agergarGrupo(Persona p, Grupo g)
        {
            try
            {
                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
                p.Grupo.Add(g);
                g.Persona.Add(p);
                oe.SaveChanges();
                
            }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }

        public void agergarEmail(Persona p, Email e)
        {
            try
            {            
                ManejadorEmail.getInstance().agregarEmail(e);
                Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
                p.Email.Add(e);
                oe.SaveChanges();
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }
        }

        public String exportar(char separador)
        {
            String exp = "";
            var personas = GestorModelo.getInstance().getModelo().Persona;
            bool primera = true;

            foreach (var p in personas)
            {
                if (!primera) { exp += separador + "\n"; }
                exp += p.nombre + separador + p.apellido + separador + p.fechaNacimiento + separador + p.comentario;

                exp += ManejadorDireccion.getInstance().exportar(separador, p.id);
                exp += ManejadorEmail.getInstance().exportar(separador, p.id);
                exp += ManejadorTelefono.getInstance().exportar(separador, p.id);
                exp += ManejadorGrupo.getInstance().exportar(separador, p);
                primera = false;
            }

            return exp;
        }

        internal bool contieneDrireccion(Persona p, Direccion dir)
        {           
            Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
            List<Direccion> direcc = p.Direccion.ToList();

            foreach (Direccion d in direcc)
            {
                if (ManejadorDireccion.getInstance().Igual(dir, d)) 
                {
                    return true;
                }
            }
            return false;
        }

        internal bool contieneEmail(Persona p, Email email)
        {
            Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
            List<Email> emails = p.Email.ToList();

            foreach (Email e in emails)
            {
                if (ManejadorEmail.getInstance().Igual(email, e))
                {
                    return true;
                }
            }
            return false;
        }

        internal bool contieneTelefono(Persona p, Telefono tel)
        {
            Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
            List<Telefono> tels = p.Telefono.ToList();

            foreach (Telefono t in tels)
            {
                if (ManejadorTelefono.getInstance().Igual(tel, t))
                {
                    return true;
                }
            }
            return false;
        }

        internal bool contieneGrupo(Persona p, Grupo g)
        {
            Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();
            List<Grupo> gps = p.Grupo.ToList();

            foreach (Grupo gs in gps)
            {
                if (ManejadorGrupo.getInstance().Igual(gs, g))
                {
                    return true;
                }
            }
            return false;
        }

        public DateTime getCumpleanio(Persona p)
        {
            int anios = DateTime.Today.Year - p.fechaNacimiento.Year;
            DateTime fecha = p.fechaNacimiento;
            return fecha.AddYears(anios);
        }

    }   
}
